// Kokomi.js - Three.js 封装框架（提供组件化开发）
// Three.js - 3D 渲染引擎
// three-stdlib - Three.js 标准库（包含 GLTF 加载器等）
// TypeScript - 类型安全的 JavaScript 超集
import * as kokomi from "kokomi.js";
import * as THREE from "three";
import * as STDLIB from "three-stdlib";

import type Experience from "../Experience";
// kokomi.Component 是一个类继承体系
// Kokomi.js 框架依赖类继承
export default class Car extends kokomi.Component {
  declare base: Experience;// 必须通过继承获得
  model: STDLIB.GLTF;
  modelParts: THREE.Object3D[];
  bodyMat!: THREE.MeshStandardMaterial;
  wheelModel!: THREE.Group;
// constructor()- 初始化
// addExisting() - 添加到场景
// update()- 每帧更新（由框架自动调用）
  constructor(base: Experience) {
    super(base); // 必须调用父类构造函数
// 模型获取
    const model = this.base.am.items["sm_car"] as STDLIB.GLTF;
    this.model = model;
// 模型扁平化
// flatModel() 将嵌套的场景树展平成数组
// printModel() 在控制台打印模型结构，方便调试
// 通过索引访问特定部件（如 modelParts[2] 是车身，modelParts[35] 是车轮）
    const modelParts = kokomi.flatModel(model.scene);
    kokomi.printModel(modelParts);
    this.modelParts = modelParts;

    this.handleModel();
  }
  // 添加到场景
  addExisting() {
    this.container.add(this.model.scene);
  }
  /* update 需要手动在外部调用 */
  // 动画更新
  update(): void {
    this.wheelModel?.children.forEach((item) => {
      // 根据参数，速度越快，车轮越快，
      // 符号表示逆时针旋转
      item.rotateZ(-this.base.params.speed * 0.03);
    });
  }
  // 材质处理
  handleModel() {
    // 车身
    const body = this.modelParts[2] as THREE.Mesh;
    const bodyMat = body.material as THREE.MeshStandardMaterial;
    this.bodyMat = bodyMat;
    bodyMat.color = new THREE.Color("#26d6e9");
    if (this.base.params.isFurina) {
      bodyMat.color = new THREE.Color("white");
      bodyMat.map = this.base.am.items["decal"];
    }

    // @ts-ignore AO贴图应用 
    this.modelParts.forEach((item: THREE.Mesh) => {
      if (item.isMesh) {
        // 材质
        const mat = item.material as THREE.MeshStandardMaterial;
        mat.aoMap = this.base.am.items["ut_car_body_ao"];
      }
    });
// 车轮引用
    const Wheel = this.modelParts[35] as THREE.Group;
    this.wheelModel = Wheel;
  }
  // 在加速时调用，增强车身的环境反射效果
  setBodyEnvmapIntensity(value: number) {
    if (this.bodyMat) {
      this.bodyMat.envMapIntensity = value;
    }
  }
  
  // 设置车身纯色
  // setBodyColor(color: string) {
  //   // 控制车身贴图与环境反射参数
  //   if (this.bodyMat) {
  //     this.bodyMat.color = new THREE.Color(color);
  //     this.bodyMat.map = null; // 移除贴图
  //     this.bodyMat.needsUpdate = true;
  //   }
  // }
  setBodyColor(color:string){
    if(this.bodyMat){
      this.bodyMat.color=new THREE.Color(color);
      this.bodyMat.map=null;
      this.bodyMat.needsUpdate=true;
    }
  }
  // 设置车身贴图
  // setBodyTexture(textureName: string) {
  //   if (this.bodyMat) {
  //     const texture = this.base.am.items[textureName] as THREE.Texture;
  //     if (texture) {
  //       // 配置贴图属性
  //       texture.flipY = false;
  //       texture.colorSpace = THREE.SRGBColorSpace;
        
  //       // 应用贴图
  //       this.bodyMat.map = texture;
  //       this.bodyMat.color = new THREE.Color("#ffffff"); // 白色以显示完整贴图
  //       this.bodyMat.needsUpdate = true;
  //     }
  //   }
  // }
  setBodyTexture(textureName:string){
    if(this.bodyMat){
      const texture=this.base.am.items[textureName]as THREE.Texture;
      if(texture){
        texture.flipY=false;
        texture.colorSpace=THREE.SRGBColorSpace;
        // 应用贴图
        this.bodyMat.map=texture;
        this.bodyMat.color=new THREE.Color('#fff')
        this.bodyMat.needsUpdate=true;
      }
    }
  }
}
